import axios from 'axios'
import Cookies from "js-cookie";
import globalConfigs from '@/utils/globalConfigs';
import { tansParams } from "@/utils/public";
import errorCode from '@/utils/errorCode'
import store from '@/store'
import { UnZip } from '@/utils/zip'

import { Notify, Toast } from 'vant';
import FlutterBridge from "@/utils/FlutterBridge";
// import {getUUID} from '@/utils/public.js';

// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项，表示请求URL公共部分
  baseURL: globalConfigs.API_BASE_URL,
  // 超时 改为3分钟 改这里
  timeout: 600000 * 3
})
// request拦截器
service.interceptors.request.use(config => {
  // console.log('request拦截器---start--');
  // 判断是否是正式环境
  if (globalConfigs.IS_DEV) {
    // 加载动画
    Toast.loading({
      duration: 0, // 持续展示 toast
      message: '加载中...',
      forbidClick: true,
    });
  } else {
    FlutterBridge.RequestFlutterBridge('showLoading');// 开启加载动画
  }

  config.headers["Lang"] = Cookies.get("Lang") || 'zh_CN'; // 国际化传参
  if (config.method === 'post' || config.method === 'put') {
    axios.defaults.headers['Content-Type'] = 'application/json;charset=UTF-8'
  }
  // 是否需要设置 token
  const isToken = (config.headers || {}).isToken === false;
  if (!isToken) {
    config.headers['Authorization'] = Cookies.get("TokenHead") + Cookies.get('Token')// 让每个请求携带自定义token 请根据实际情况自行修改
    config.headers['Login-Client-Id'] = Cookies.get("Login-Client-Id");

  }
  // get请求映射params参数
  if (config.method === 'get' && config.params) {
    let url = config.url + '?' + tansParams(config.params);
    url = url.slice(0, -1);
    config.params = {};
    config.url = url;
  }
  return config
}, error => {
  console.log(error)
  // 判断是否是正式环境
  if (globalConfigs.IS_DEV) {
    Toast.clear();
  } else {
    FlutterBridge.RequestFlutterBridge('closeLoading');// 开启加载动画
  }
  Promise.reject(error)
})
/**
 * @Description: 不间断刷新token-响应code未401时拦截、刷新
 * @Author: gaohaihong
 * @Date: 2022-04-12
 */
// 是否正在刷新的标记 -- 防止重复发出刷新token接口--节流阀
let isRefreshing = false;
// 失效后同时发送请求的容器 -- 缓存接口
let requests = [];
// 响应拦截器 ,请求成功增加601编码
//code = 602是密期超期提示
//code=603是用户多地同时登录提示
service.interceptors.response.use(res => {
  // console.log('request拦截器---end--');
  // 判断是否是正式环境
  if (globalConfigs.IS_DEV) {
    Toast.clear();
  } else {
    FlutterBridge.RequestFlutterBridge('closeLoading');// 开启加载动画
  }
  // 未设置状态码则默认成功状态
  const code = res.data.code || 200 || 601;
  // 获取错误信息
  const msg = errorCode[code] || res.data.msg || res.data.message || errorCode['default']
  // 二进制数据则直接返回
  if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
    return res.data
  }
  if (code === 401) {//约定code 401- token 过期

    if (!globalConfigs.IS_DEV) {
      FlutterBridge.RequestFlutterBridge('getTokenFromFlutter');// 从flutter获取token
    }
    if (!isRefreshing) {
      isRefreshing = true
      //调用刷新token的接口
      return store.dispatch('refreshToken').then(resp => {
        // const { token } = resp
        console.log('调用刷新token的接口---requestSrever--->', resp)
        res.headers.Authorization = `${resp}`
        // token 刷新后将数组的方法重新执行
        requests.forEach((cb) => cb(resp))
        requests = [] // 重新请求完清空
        return service(res.config)
      }).catch(err => {
        console.log('请求报错------>', err);
        //刷新token失败，跳到登录页
        // MessageBox.confirm('登录状态已过期，请重新登录', '系统提示', {
        //    confirmButtonText: '重新登录',
        //    type: 'warning',
        //    showCancelButton:false,
        //    showClose:false,
        //    closeOnClickModal:false,
        //    closeOnPressEscape:false
        //  }).then(() => {
        //    store.dispatch('LogOut').then(() => {
        //      location.href = '/index';
        //    }).catch(() => {
        //      location.href = '/index';
        //    })
        //  }).catch(() => {});
        // return Promise.reject(err)
      }).finally(() => {
        isRefreshing = false
      })
    } else {
      // 返回未执行 resolve 的 Promise
      return new Promise(resolve => {
        // 用函数形式将 resolve 存入，等待刷新后再执行- 添加缓存接口
        requests.push(token => {
          res.headers.Authorization = `${token}`
          resolve(service(res.config))
        })
      })
    }
  } else if (code == 602 || code == 603) {
    if (msg != '') {
      Notify({
        message: msg,
        type: 'warning'
      })
    }
    return res.data
  }
  else if (code !== 200 && code != 601 && code != 602 && code != 603) {
    if (msg != '') {
      Notify({
        message: msg,
        type: 'error'
      })
    }
    return Promise.reject(new Error(msg))
  }
  // else if (code !== 200) {
  //   Notification.error({
  //     title: msg
  //   })
  //   return Promise.reject('error')
  // }
  else {
    if (res.data.zip) {
      res.data.data = UnZip(res.data.data)
    }
    return res.data
  }
},
  error => {
    console.error('后端返回错误---拦截---->' + error)
    // let { message } = error;
    // if (message == "Network Error") {
    //   message = "后端接口连接异常";
    // }
    // else if (message.includes("timeout")) {
    //   message = "系统接口请求超时";
    // }
    // else if (message.includes("Request failed with status code")) {
    //   message = "系统接口" + message.substr(message.length - 3) + "异常";
    // }
    // Message({
    //   message: message,
    //   type: 'error',
    //   duration: 5 * 1000
    // })
    return Promise.reject(error)
  }
)


export default service;